切换主题
选择排序
规则:
- 升序:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位
- 降序:双重循环遍历数组,每经过一轮比较,找到最大元素的下标,将其交换至首位
一元选择
JavaScript
const selectionSort = A => {
const len = A.length
for (let i = 0; i < len - 1; i++) {
let minIdx = i
for (let j = i + 1; j < len; j++) { // 前 i+1 个数已排序
if (A[minIdx] > A[j]) minIdx = j // 找出未排序数中最小值的下标
}
if (minIdx !== i) { // 相等时不交换
[A[minIdx], A[i]] = [A[i], A[minIdx]]
}
}
}
二元选择
JavaScript
const selectionSort = A => {
const len = A.length
// 由于每趟排序必有两个元素(最小值、最大值)被排序,故只需遍历原数据的一半
for (let i = 0; i < len >> 1; i++) {
let minIdx = maxIdx = i
for (let j = i + 1; j < len - i; j++) {
if (A[minIdx] > A[j]) minIdx = j
if (A[maxIdx] < A[j]) maxIdx = j
}
if (minIdx === maxIdx) break // 说明排序已完成
if (minIdx !== i) {
// 将最小元素置于最前
[A[minIdx], A[i]] = [A[i], A[minIdx]]
}
// 最大值的下标刚好是 i 时,由于 A[i] 与 A[minIdx] 交换时将最大值换到了 minIdx 处
if (maxIdx === i) maxIdx = minIdx
const lastIdx = len - 1 - i
if (maxIdx !== lastIdx) {
// 将最大元素置于最后
[A[maxIdx], A[lastIdx]] = [A[lastIdx], A[maxIdx]]
}
}
}